/*
 * @Author:Iyoole
 * @Time  :2017-11-29
 * @Description:路由
 * @git:
 * */
;!function(e){
    "use strict";
    var i,c={
        gu:function(){
            var h = location.hash.split("?"),
                n = h[0].split("#")[1],//路由地址
                p = h[1] ? h[1].split("&") : [],//参数内容
                q = {};
            for(var x = 0;x<p.length ; x++){
                var m = p[x].split("=");
                q[m[0]] = m[1]
            }
            return  {
                path:n,
                query:q
            }
        },
        isFun:function(o){
            return Object.prototype.toString.call(o)==='[object Function]'
        },
        isArr:function(o){
            return Object.prototype.toString.call(o)==='[object Array]'
        }
    },config={
        path:'',
        template:'',
        join:'',
        back:'',
        async:''
    };
    var router=function(){
        this.rs={};//用来存放注册路由
        this.way=[];//用于记录hash
    };
    router.pt=router.prototype;
    router.pt.render=function(){
        var t=this;
        window.addEventListener('load',function(){
            t.load()
        });
        window.addEventListener('hashchange',function(){
            t.change()
        });
    };
    router.pt.map=function(opts){//注册路由
        if(c.isArr(opts)){
            var t=this;
            for(var x=0;x<opts.length;x++){
                var path=opts[x]['path'].replace(/\s*/g,'');
                t.rs[path]=i.extend({},config,opts[x]);
                opts[x]['async']?t.rs[path]['fn']=-1:'';
            }
        }else{
            console.trace('路由配置不对')
        }
    };
    router.pt.load=function(){
        var nh=c.gu();
        if(this.rs[nh.path]){
            this.way=[nh.path];
            var b=i('<div/>').addClass('router-page').attr('data-router',nh.path).append(i('#'+this.rs[nh.path]['template']).html());//加入新元素
            b.appendTo(i('.router-warp'));
            this.refresh(nh)
        }else{
            location.hash='/index'
        }
    };
    router.pt.change=function(){
        var nh=c.gu(),t=this;
        if(t.rs[nh.path]){
            if(t.way[t.way.length-1]==nh.path){
                t.call(1,nh)
            }else{
                if(t.way.length>1&&t.way[t.way.length-2]==nh.path){
                    t.exit(nh);
                    t.refresh(nh,2)
                }else{
                    t.join(nh.path);
                    t.refresh(nh,1)
                }
            }
        }
    };
    router.pt.join=function(p){//加入
        var t=this;
        var b=i('<div/>').addClass('router-page').attr('data-router',p).append(i('#'+t.rs[p]['template']).html());//加入新元素
        if(t.way[t.way.length-1]){
            b.addClass('pageIn');
            i('[data-router="'+t.way[t.way.length-1]+'"]').removeClass('pageIn pageShow').addClass('pageHide');
        }
        b.appendTo(i('.router-warp'));
        t.way.push(p);
    };
    router.pt.exit=function(){//退出
        var t=this,lp=t.way[t.way.length-1];
        i('[data-router="'+lp+'"]').removeClass('pageIn pageShow').addClass('pageOut');
        i('[data-router="'+t.way[t.way.length-2]+'"]').removeClass('pageHide').addClass('pageShow');
        t.way.pop();
        setTimeout(function(){
            i('[data-router="'+lp+'"]').remove();
        },600)
    };
    router.pt.call=function(type,nh){
        var t=this;
        if(type==1){
            var join;
            try{
                join=eval(t.rs[nh.path]['join']);
                join(nh['query']);
            }catch (e){}
        }else{
            var back;
            try{
                back=eval(t.rs[nh.path]['back']);
                back();
            }catch (e){}
        }
    };
    router.pt.refresh=function(nh,type){
        var t=this;
        type=type||1;
        if(t.rs[nh.path].fn==-1){
            var _b=document.getElementsByTagName('body')[0];
            var _s=document.createElement('script');
            _s.type='text/javascript';
            _s.src=t.rs[nh.path]['async'];
            _s.async=true;
            _s.onload=function(){
                t.rs[nh.path].fn=1;
                t.call(type,nh)
            };
            _b.appendChild(_s)
        }else{
            t.call(type,nh)
        }
    };

    var JsRouter=new router();

    JsRouter.v='1.0.1';

    if(window.fui && fui.define ){
        fui.define('jquery', function(exports){
            e.JsRouter=JsRouter;
            i=fui.$;
            exports('JsRouter', JsRouter);
            JsRouter.render()
        });
    }else{//如果直接引用的话
        e.JsRouter=JsRouter;
        i=e.jQuery;
        JsRouter.render()
    }
}(window);


/*
* 说明
* JsRouter.map([]);用来定义路由
* 每个路由       ↑
* {
*   path:'/index',//路由路径       --必填,否则默认进入/index
*   template:'aPage',//路由模板    --必填
*   join:'aJoin',//进入此路由执行   --选填,进入此界面执行方法
*   back:'aBack',//退回此路由执行   --选填,进回此界面执行方法
*   async:'../js/a.js'//异步加载   --选填,异步加载文件
* }
* JsRouter.render();//初始化路由
*
* */





